#include <bits/stdc++.h>
using namespace std;
const int N=1e4+50;
struct Edge{
    int v,w,next;
}edge[N*2];
int cnt,head[N];
void init(){
    cnt=0;
    memset(head,-1,sizeof(head));
}
void add(int u,int v,int w){
    edge[cnt]=Edge{v,w,head[u]};
    head[u]=cnt++;
    edge[cnt]=Edge{u,w,head[v]};
    head[v]=cnt++;
}
int n,v,w;
int dp[N][3];
//记录u的最长路经过那个子节点v
int idx[N];
void dfs1(int u,int f){
    int _max=0;
    int _sec=0;
    for(int i=head[u];i!=-1;i=edge[i].next){
        int v=edge[i].v;
        int w=edge[i].w;
        if(v==f){
            continue;
        }
        dfs1(v,u);
        if(_max<dp[v][0]+w){
            _sec=_max;
            _max=dp[v][0]+w;
            idx[u]=v;
            //最长和次长不能是同一个v
            // if(_sec<dp[v][1]+w){
            //     _sec=dp[v][1]+w;
            // }
        }else if(_sec<dp[v][0]+w){
            _sec=dp[v][0]+w;
        }
    }
    //以u为根节点到子节点的最远距离
    dp[u][0]=_max;
    dp[u][1]=_sec;
}
void dfs2(int u,int f){
    for(int i=head[u];i!=-1;i=edge[i].next){
        int v=edge[i].v;
        int w=edge[i].w;
        if(v==f){
            continue;
        }
        //已有数据,先更新
        if(idx[u]==v){
            dp[v][2]=max(dp[u][1]+w,dp[u][2]+w);
        }else{
            dp[v][2]=max(dp[u][0]+w,dp[u][2]+w);
        }
        dfs2(v,u);
    }
}
int main(void){
    while(~scanf("%d",&n)){
        init();
        for(int i=2;i<=n;i++){
            scanf("%d%d",&v,&w);
            add(i,v,w);
        }
        memset(dp,0,sizeof(dp));
        dfs1(1,0);
        dfs2(1,0);
        for(int i=1;i<=n;i++){
            printf("%d\n",max(dp[i][0],dp[i][2]));
        }
    }
    return 0;
}